Memori Lokal, Variabel & Tipe Data Dasar
Konteks OSN: Kenapa Belajar Ini?
Di OSN, jarang ada soal yang meminta kamu menulis program dari nol. Kamu justru diminta membaca program rumit buatan juri. Tanpa insting Tracing Memori yang kuat, kamu akan tersesat di tengah-tengah soal tipe "Berapa keluaran dari program berikut?".
💡 Intuisi & Analogi Jaman Now
"Bayangkan variabel itu seperti loker penitipan barang di stasiun yang hanya muat 1 barang. Jika loker berlabel X awalnya berisi 'Sepatu', lalu kamu memasukkan 'Tas', maka 'Sepatu' tersebut langsung dibuang dan hilang. Komputer tidak menyimpan riwayat masa lalu!"
Rasa Ingin Tahu: Kenapa komputer hapus data lama?
Komputer punya RAM (memori) yang terbatas. Daripada menumpuk ribuan versi lama dari sebuah variabel, jauh lebih efisien dan cepat jika memori itu ditimpa (overwrite). Kalau kamu butuh data lamanya, kamu harus sengaja membuat variabel baru untuk menyimpannya.
Apa yang Sering Dikira Pemula
Mengira tanda = itu berarti "setara" seperti di pelajaran Matematika. Sehingga kalau ada a = b, dipikir "oh berarti nilai a akan selalu sama dengan b ke depannya."
Yang SEBENARNYA Terjadi
= di C++ adalah perintah Assignment (Pemaksaan). a = b artinya: "Ambil nilai b SAAT INI, lalu paksa masuk ke loker a." Setelah itu, mereka tidak ada hubungan lagi. Jadilah robot compiler: baca dari atas ke bawah.
Tebak Dulu Sebelum Lanjut!
int a = 5;
int b = a + 2;
a = b - 1;
b = a * a;
Menurutmu, berapa nilai akhir a dan b di akhir program ini?
Tampilkan Jawaban
Visualisasi Tracing Variabel
📝 Contoh Sederhana & Alur Eksekusi
Mari kita lihat bagaimana memori komputer melacak nilai variabel baris demi baris. Perhatikan kode di bawah ini, tanda // berarti baris komentar (hanya catatan untuk manusia, diabaikan oleh komputer).
👩🏫 Secara Formal: Memori dalam OSN
Dalam soal OSN, kemampuan melacak memori baris-demi-baris secara runut disebut Tracing (Penelusuran). Kamu tidak boleh menebak-nebak, tapi harus membaca kode persis seperti komputer membacanya secara sekuensial (berurutan dari atas ke bawah).
Kamus Tipe Data Dasar
Sebelum bisa menggunakan variabel, kita wajib mendeklarasikan tipe datanya. Berikut yang paling sering muncul:
int(Integer): Khusus bilangan bulat. Rentangnya maksimal sekitar ~2 miliar.long long: Bilangan bulat yang super besar. Digunakan jika soal OSN memiliki batasan angka hingga 1018.bool(Boolean): Logika benar/salah. Hanya menyimpan dua nilai:true(1) ataufalse(0).
Pola Pikir Salah yang Sering Terjadi (Common Wrong Thinking)
Miskonsepsi 1: "Tanda `=` itu artinya nilainya sama persis kayak di Aljabar."
Kenapa Salah? Di C++, `=` adalah operator Assignment (Penugasan). Ia BUKAN membandingkan, melainkan MEMAKSA loker di sebelah kiri untuk diisi dengan hasil perhitungan di sebelah kanan. Kalau mau membandingkan, kita pakai `==`.
Miskonsepsi 2: "Hasil dari `5 / 2` (dengan tipe data integer) adalah 2.5."
Kenapa Salah? Komputer itu pelit! Kalau tipenya `int` (bilangan bulat), maka `5 / 2` hasilnya `2`. Sisa desimalnya (0.5) dibuang begitu saja (Truncation), bukan dibulatkan. Hati-hati, banyak peserta gugur di sini.
Latihan Bertingkat (Progressive Tracing)
int x = 10;
x = x + 5;
x = x * 2;
Tampilkan Jawaban
x diisi 10.Baris 2: Hitung (10 + 5) = 15. Paksa masuk ke
x. Nilai 10 musnah.Baris 3: Hitung (15 * 2) = 30. Paksa masuk ke
x.Akhir:
x = 30
int a = 3;
int b = 7;
int temp = a;
a = b;
b = temp;
Tampilkan Jawaban
1. Loker
temp meng-copy isi a (3).2. Loker
a ditimpa isi b (7). Sekarang a = 7.3. Loker
b ditimpa isi temp (3).Akhir:
a = 7, b = 3 (Nilai berhasil ditukar).
Checkpoint: Uji Pemahamanmu
Coba jelaskan dengan bahasamu sendiri: Apa yang terjadi jika pada "Level 1: Pemanasan" tadi, nilai awal x diganti menjadi 0? Apakah x = x * 2 pada akhirnya akan membuat hasilnya tetap 0?
Tampilkan Jawaban
x = 0, maka setelah baris kedua x = 0 + 5 nilainya menjadi 5. Lalu pada baris ketiga x = 5 * 2 nilainya menjadi 10. Jangan terjebak "kalau awalnya 0 dikali berapapun tetap 0", karena ingat: komputer mengeksekusi berurutan!
Rangkuman Kilat
Core Idea: "Variabel hanyalah kotak penyimpan tunggal; operasi assignment (=) secara kejam menimpa kotak tersebut dengan nilai baru tanpa peduli masa lalunya."
=artinya timpa loker kiri dengan hasil hitungan di kanan.- Komputer mengeksekusi dari atas ke bawah, baris demi baris.
- Tipe data
intmembuang habis angka desimal tanpa pembulatan.
Lab Mandiri: Coba Tracing Sendiri!
Hitung manual nilai akhir X dan Y dari logika kode di bawah ini layaknya soal OSN Kabupaten.
int x = 10;
int y = 5;
x = x + y;
y = x - y;
x = x - y;
x = x * 2;
Logika Percabangan & If-Else
Konteks OSN: Kenapa Belajar Ini?
Di OSN, if-else sering dibuat bertumpuk (nested) dan sangat kompleks. Pembuat soal suka menjebak dengan kondisi yang terlihat benar secara kasat mata, padahal dievaluasi berbeda oleh komputer karena aturan prioritas logika (AND/OR).
💡 Intuisi & Analogi Jaman Now
"Percabangan itu mirip milih rute di Google Maps. Kalau jalan A macet (kondisi true), kamu disuruh lewat rute alternatif. Kalau lancar (kondisi false), kamu tetap di jalan utama."
Cek Prasyarat: Sudah Paham Beda = dan == ?
Sebelum masuk ke Percabangan, kamu WAJIB tahu perbedaan dua simbol ini:
a = 5 (Assignment): Memaksa loker a diisi angka 5. Hasilnya selalu true (jika bukan 0).
a == 5 (Comparison): Bertanya, "Apakah isi loker a itu 5?" Jawabannya murni true atau false.
Sangat banyak peserta OSN salah ketik if (a = 5) yang membuat kondisinya selalu True!
Mental Model: Evaluasi Malas (Short-Circuit)
Komputer itu pemalas dan efisien. Ia akan berhenti mengecek syarat begitu kesimpulannya sudah pasti.
- Logika AND (
&&): Seperti masuk wahana: "Harus bawa tiket DAN tinggi 150cm". Kalau kamu nggak bawa tiket, petugas nggak usah repot-repot ngukur tinggi kamu. Pasti ditolak! - Logika OR (
||): Seperti jalur VIP: "Bawa kartu VIP ATAU bawa surat sakti". Kalau kamu bawa kartu VIP, petugas langsung mempersilakan masuk tanpa ngecek surat saktimu.
Visualisasi Short-Circuit Evaluation
1. Sistem mengecek sisi Kiri: (5 > 2). Benar! -> TRUE.
2. Karena baru dapat TRUE (untuk AND), sistem lanjut ke Kanan: (10 != 10). Salah! -> FALSE.
1. Sistem mengecek Kiri: (!false). Itu TRUE!
2. Karena evaluasi OR (||) hanya butuh satu TRUE, dia otomatis berhenti.
📝 Contoh Sederhana & Alur Logika
Mari kita lihat bagaimana komputer membaca perintah if:
Visual Reasoning: Cara Komputer Membaca if di atas
| Langkah | Aksi Komputer | Hasil Evaluasi | Kesimpulan |
|---|---|---|---|
| 1 | Cek (tiket > 0) |
FALSE | Karena tiket=0 |
| 2 | Lihat operator | && (AND) | AND butuh semua TRUE |
| 3 | Cek (tinggi >= 150) |
SKIPPED | Karena Kiri sudah FALSE (Short-Circuit) |
💡 Ambil Nafas Sejenak!
Logika && dan || memang agak menjebak. Jika kamu lelah, regangkan badan. Intinya: Komputer selalu cari jalan termalas untuk menentukan True/False!
👩🏫 Secara Formal: Operator Logika & Relasional
Blok if mengevaluasi sebuah kondisi boolean. Jika kondisinya true, blok kode di dalamnya dijalankan. Jika tidak, akan dilewati atau mengeksekusi blok else.
Bedah Tabel Logika
&&(AND): BernilaitrueHANYA JIKA kedua sisi bernilaitrue. (Sifat Short-circuit: Jika kirifalse, kanan tidak dihiraukan).||(OR): Bernilaitruejika SALAH SATU sisitrue. (Sifat Short-circuit: Jika kiri sudahtrue, kanan tidak dihiraukan).!(NOT): Membalik kondisi (True jadi False, False jadi True).
Pola Pikir Salah yang Sering Terjadi (Common Wrong Thinking)
Miskonsepsi 1: "Kesalahan ketik if (a = 5) itu akan error."
Kenapa Salah? Tidak akan error! Komputer akan memasukkan nilai 5 ke a, lalu menganggap nilai 5 itu bernilai true (semua angka selain 0 dianggap true). Blok `if` akan SELALU tereksekusi. Ini bug yang paling susah dicari oleh pemula. Biasakan pakai ==.
Miskonsepsi 2: "Semua baris di dalam if (A && B) pasti dieksekusi komputernya."
Kenapa Salah? Ingat sifat Short-Circuit! Jika A sudah `false`, sisi B TIDAK PERNAH DIBACA sama sekali. Jika B adalah fungsi yang menambah variabel (misal: x++), variabel `x` tidak akan bertambah nilainya!
Latihan Bertingkat (Percabangan)
int x = 10;
if (x > 5) {
x = x - 5;
}
x = x * 2;
Tampilkan Jawaban
2. Cek: Apakah 10 > 5? TRUE.
3. Karena TRUE, masuk ke dalam kurung kurawal. x = 10 - 5 = 5.
4. Lanjut ke baris terakhir: x = 5 * 2 = 10.
Akhir:
x = 10
int y = 0;
int z = 5;
if (y > 0 && ++z > 0) {
y = 1;
}
Tampilkan Jawaban
2. Karena AND (&&) butuh keduanya benar, dan sisi kiri sudah FALSE, maka komputer SKIP sisi kanan.
3. Perintah
++z TIDAK PERNAH DIJALANKAN! z tetap 5.Akhir:
y = 0, z = 5.
Rangkuman Kilat & Pattern OSN
Core Idea: "If-Else adalah jalan tol bercabang, di mana gerbangnya (logika) dievaluasi dengan cara yang sangat malas (short-circuit)."
- AND (&&): Jika kiri FALSE, kanan SKIP (hasil otomatis FALSE).
- OR (||): Jika kiri TRUE, kanan SKIP (hasil otomatis TRUE).
- Jangan tertukar
=(Penugasan) dengan==(Perbandingan).
Pattern Recognition (Kapan memikirkan ini?)
Di OSN, saat melihat soal dengan banyak && dan ||, JANGAN hitung sisi kanannya dulu! Cek sisi kiri, kalau sudah pasti hasil akhirnya (TRUE untuk OR, FALSE untuk AND), langsung coret sisi kanannya agar menghemat waktu hitungmu.
Lab OSN: Truth Checker
Evaluasi nilai kebenaran akhir dari kumpulan percabangan memusingkan yang rawan menjebak peserta Olimpiade di bawah ini:
(5 > 2) && (10 != 10)
!false || (3 <= 1)
Perulangan (Loop)
Konteks OSN: Kenapa Belajar Ini?
Soal OSN hampir selalu mengandung for loop bersarang (nested loop). Jika kamu tidak tahu cara kerja pasti sebuah loop, kamu tidak akan bisa memprediksi seberapa lama kode berjalan, dan programmu bisa terkena Time Limit Exceeded (TLE)!
💡 Intuisi & Analogi Jaman Now
"Mikirin For loop tuh layaknya mesin fotokopi. Kamu setting 10 lembar sebagai target. Mesin akan mencetak (1, 2, 3...) dan langsung berhenti begitu konternya mencapai 10."
Mental Model: Satpam dan Pekerja
Sebuah loop punya dua tokoh fiktif di dalamnya:
- Sang Satpam (Syarat/Kondisi): Berdiri di pintu depan. Setiap kali putaran mau mulai, satpam nanya: "Syarat masih terpenuhi nggak?". Kalau
false, pintu langsung dikunci rapat. - Sang Pekerja (Modifier): Bertugas menghitung (misal: nambah 1). Pekerja ini selalu bertugas di PALING AKHIR setelah blok kode di dalam kurung kurawal selesai.
Tebak Dulu Sebelum Lanjut!
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
print("Bintang");
}
}
Secara total, berapa kali kata "Bintang" akan dicetak?
Tampilkan Jawaban
Visualisasi Eksekusi Loop ( i & j )
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
print("Bintang");
}
}
| Siklus | Luar (i) | Dalam (j) | Eksekusi |
|---|---|---|---|
| 1 | 1 | 1 | Print "Bintang" ke-1 |
| 2 | 2 | 1 | Print "Bintang" ke-2 |
| 3 | 2 | 2 | Print "Bintang" ke-3 |
| 4 | 3 | 1 | Print "Bintang" ke-4 |
| 5 | 3 | 2 | Print "Bintang" ke-5 |
| 6 | 3 | 3 | Print "Bintang" ke-6 |
📝 Contoh Sederhana & Anatomi Loop
👩🏫 Secara Formal: Eksekusi Mutlak Loop
Mekanisme for loop selalu mengeksekusi urutan 4 langkah ini secara ketat:
1) Inisialisasi (int i = 1) - Dieksekusi HANYA SEKALI di awal.
2) Evaluasi Syarat (i <= 3) - Jika true lanjut, jika false loop selesai seketika.
3) Eksekusi Blok (Isi di dalam {}).
4) Modifier (i++) - Dijalankan, lalu kembali mengulang ke langkah 2.
Pola Pikir Salah yang Sering Terjadi (Common Wrong Thinking)
Miskonsepsi 1: "Loop for(int i=0; i<3; i++) berjalan 4 kali karena dari 0 sampai 3."
Kenapa Salah? Hitung pakai jari: 0, 1, 2. Saat i jadi 3, syarat 3 < 3 itu FALSE! Pintu langsung ditutup. Jadi loop ini pas berjalan 3 kali. Ini disebut Off-by-one Error.
Miskonsepsi 2: "Modifier i++ jalan duluan sebelum blok kode di eksekusi."
Kenapa Salah? Modifier itu seperti petugas kebersihan. Dia baru kerja menyapu setelah pengunjung (blok kode) selesai bermain dan keluar. Urutannya: Cek Syarat -> Jalankan Blok -> Eksekusi Modifier.
Latihan Bertingkat (Iterasi Loop)
int x = 0;
for (int i = 1; i <= 3; i++) {
x = x + 2;
}
Tampilkan Jawaban
Setiap jalan, x ditambah 2.
Berarti: 0 + 2 + 2 + 2 = 6.
Akhir:
x = 6
int ans = 0;
for (int i = 5; i > 0; i++) {
ans++;
}
Tampilkan Jawaban
i++! Bukannya berkurang ke 0, i malah makin besar (5, 6, 7...).Syarat
i > 0 akan SELALU TRUE selamanya.Akhir: Program macet (Infinite Loop / Time Limit Exceeded).
Rangkuman Kilat & Pattern OSN
Core Idea: "Loop adalah pekerja yang taat; ia selalu mengecek syarat (Satpam) sebelum bekerja, dan baru menjalankan modifier setelah selesai bekerja."
for(awal; syarat; modifier).- Syarat dicek SEBELUM masuk blok (Satpam).
- Modifier dijalankan SETELAH blok selesai (Pekerja).
- Waspada jebakan kondisi yang bikin loop jalan selamanya (Infinite Loop).
Pattern Recognition (Kapan memikirkan ini?)
Di soal OSN yang meminta output akhir dari nested loop, cari pola angkanya (seperti deret matematika). Jangan menelusuri ratusan iterasi secara manual! Contoh: Loop dalam berjalan i kali, loop luar n kali. Itu sama dengan Deret Aritmatika 1 + 2 + ... + n.
Lab OSN: Prediksi Iterasi Loop Bersarang
Berapa kali persisnya sistem akan mencetak string "Bintang" pada potongan C++ ini?
int count = 0;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
print("Bintang");
count++;
}
}
Konsep Fungsi & Scope Variabel
Konteks OSN: Kenapa Belajar Ini?
Di soal rekursi OSN (pemanggilan fungsi berulang), nilai variabel sering dipindah-pindah lewat parameter fungsi. Jika kamu tidak paham bedanya Copy (Value) vs Asli (Reference), hasil hitungan akhirmu dijamin akan salah total!
💡 Intuisi & Analogi Jaman Now
"Pass by Value itu ibarat ada teman nitip catetan tugas ke kamu. Kamu fotokopi catetannya, terus kamu coret-coret kopiannya. Catetan aslinya tetap aman, kan? Kamu cuma mainin data tiruan (Copy)."
"Tapi kalau Pass by Reference (yang pakai simbol &), kamu minjem buku aslinya langsung. Kalau bukunya kamu coret, ya buku temanmu itu benar-benar rusak karena itu buku yang sama (Alias ke memori asli)!"
Mental Model: Dinding Kaca (Scope)
Anggap setiap fungsi { ... } adalah ruang kaca tertutup kedap suara.
- Variabel
xdi Fungsi A TIDAK SAMA dengan variabelxdi Fungsi B, meski namanya sama! Mereka beda orang di ruangan yang beda. - Kecuali ada yang membocorkan alamat ruangan pakai jalur khusus (Pointer/Reference
&).
Cek Prasyarat: Konsep Alamat Memori
Setiap variabel tidak hanya punya NILAI, tapi juga ALAMAT MEMORI (seperti alamat rumah). Saat kita melakukan pass-by-value, yang dikirim hanya nilai-nya (kopian). Saat kita melakukan pass-by-reference dengan &, yang dikirim adalah ALAMAT RUMAH-nya. Jadi si penerima bisa langsung mengacak-acak isi rumah aslinya!
Visualisasi Copy vs Reference
void addFive(int x) { // Pass by Value
x = x + 5;
}
void addFiveRef(int &y) { // Pass by Reference
y = y + 5;
}
// Simulasi Main
int a = 10;
int b = 10;
addFive(a); // A tetap 10
addFiveRef(b); // B jadi 15
Pass By Value
(Clone
Memory)
Perubahan X = 15 tidak mengubah A (Tetap 10)
Pass
By Reference
(Memory
Mapping)
Perubahan Y = 15 **LANGSUNG** merubah B = 15
📝 Contoh Sederhana: Scope (Ruang Lingkup)
👩🏫 Secara Formal: Fungsi & Scope Memori
Dalam C++, Fungsi adalah sub-program yang memiliki lokalisasi memori (Local Scope). Variabel yang dibuat di dalam kurung kurawal {} sebuah fungsi (atau if/for) akan hancur/dihapus otomatis oleh memori ketika blok tersebut berakhir. Ini menjaga agar data antar fungsi tidak saling bertabrakan.
Pola Pikir Salah yang Sering Terjadi (Common Wrong Thinking)
Miskonsepsi 1: "Kalau nama parameternya sama, berarti mereka variabel yang sama."
Kenapa Salah? Meski sama-sama bernama x, kalau yang satu di main() dan yang satu di void hitung(int x), mereka adalah dua variabel berbeda di memori! Mengubah `x` di dalam `hitung()` tidak akan ngefek ke `x` di dalam `main()` (kecuali pakai &).
Miskonsepsi 2: "Variable Global itu selalu menang melawan variabel lokal."
Kenapa Salah? Justru sebaliknya! Ini disebut Variable Shadowing. Kalau kamu bikin variabel lokal bernama A, sedangkan di global juga ada A, komputer akan memakai yang paling dekat (Lokal). Variabel globalmu jadi "terbayangi" dan tidak terubah!
Latihan Bertingkat (Fungsi & Scope)
void ubah(int a) {
a = a + 5;
}
int x = 10;
ubah(x);
Tampilkan Jawaban
&, berarti ini Pass-by-Value (Copy).Yang diubah jadi 15 hanyalah fotokopiannya (
a di dalam fungsi).Akhir: Variabel asli
x tetap 10.
int x = 1; // Global
void test() {
int x = 5; // Lokal
x = x * 2;
}
test();
Tampilkan Jawaban
test() membuat variabel lokal bernama x, membayangi (shadowing) x global.Yang dikali 2 (jadi 10) adalah
x lokal tersebut.Saat fungsi selesai,
x lokal dihancurkan.Akhir: Variabel global
x tetap 1.
Checkpoint: Uji Pemahamanmu
Coba jelaskan dengan bahasamu sendiri: Apa jadinya jika kita memanggil fungsi addFive(10) (mengirim angka literal, bukan variabel) pada fungsi pass-by-reference void addFive(int &y)?
Tampilkan Jawaban
10 adalah angka harfiah (literal) yang tidak memiliki "loker/alamat memori" yang bisa dirujuk oleh &. Pass by reference mewajibkan kamu mengirim sebuah variabel asli (yang punya loker memori).
Rangkuman Kilat & Pattern OSN
Core Idea: "Nama variabel yang sama di dalam fungsi yang berbeda adalah dua entitas yang berbeda, kecuali dihubungkan oleh portal dimensi bernama Reference (&)."
- Tanpa
&(Value): Memanipulasi copy. Data asli aman. - Pakai
&(Reference): Mengubah alias. Data asli ikut berubah seketika. - Scope: Variabel berkuasa hanya di dalam blok tempat ia dilahirkan (diapit
{}).
Pattern Recognition (Kapan memikirkan ini?)
Dalam soal rekursi OSN tingkat Kabupaten/Provinsi, perhatikan deklarasi fungsi. Jika ada & pada variabel penampung hasil (seperti void dfs(int node, int &ans)), berarti akumulasi hasil akan persisten menembus tumpukan rekursi. Jika tidak ada, variabel itu akan reset setiap kali rekursi naik ke atas (backtrack)!
Lab OSN: Tracing Amperstand Teka-teki
Tebak output kode C++ dengan pemanggilan by-Reference ini!
void testFunc(int x, int &y) {
x = x + 5;
y = y + 5;
}
int main() {
int a = 10;
int b = 10;
testFunc(a, b);
// Berapakah nilai a dan b sekarang?
}
Question Card
Jika sebuah variabel dideklarasikan di dalam sebuah fungsi, bisakah variabel tersebut diakses dari fungsi lain? Apa alasannya?
Jawaban: Tidak bisa! Variabel yang dideklarasikan di dalam sebuah fungsi disebut variabel lokal. Ia hanya "hidup" selama fungsi itu berjalan. Begitu fungsi selesai, variabel itu "mati" dan tidak bisa diakses dari mana pun. Inilah konsep Scope yang sudah kita pelajari. Bayangkan catatan di papan tulis kelasmu, begitu kelas selesai dan papan dihapus, catatan itu hilang!